home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / DEMO / KBDTEST.M < prev    next >
Encoding:
Text File  |  1990-12-11  |  5.4 KB  |  180 lines

  1. MODULE KbdTest;
  2.  
  3. (*
  4.  *                                                   Thomas Tempelmann, 4.7.89
  5.  *
  6.  * Dieses Modul dient zur Demonstration der Module 'KbdCtrl' und 'Keyboard'
  7.  * sowie der Anwendung von XBRA.
  8.  *
  9.  * Wird es gestartet, installiert es eine Prozedur als Auswertungsroutine
  10.  * für gedrückte Tasten. Die Prozedur ruft immer, wenn eine Taste ausgewertet
  11.  * werden muß, die bisherige Auswertungsfunktion auf und sieht dann nach,
  12.  * welche Taste gedrückt wurde (bzw. im Tastaturpuffer steht). Ist es
  13.  * Shift-F1, werden stattdessen andere Tasten in den Puffer geschrieben.
  14.  *
  15.  * Mit diesem Verfahren ist es also auf einfache Weise möglich, eingegebene
  16.  * Tasten zu überwachen und sie ggf. durch andere zu ersetzen oder bestimmte
  17.  * Funktionen daraufhin auszulösen.
  18.  *
  19.  * Eine weitere Anwendung, wie Tastendrücke direkt überwacht werden können,
  20.  * findet sich im Modul 'UserBreak', dessen Quelltext sich im Ordner "MOS"
  21.  * befindet.
  22.  *
  23.  * Wird das Modul unter der Shell gestartet, kann es beim Beenden der Shell
  24.  * oder durch wiederholten Start wieder freigegeben werden.
  25.  *
  26.  * Achtung:
  27.  *   Das Modul darf nicht vollständig optimiert werden, wenn es gelinkt
  28.  *   werden soll. Vielmehr ist die mittlere Optimierung zu wählen, damit
  29.  *   die Link-Informationen zum Residentmachen des Programms erhalten
  30.  *   bleiben.
  31.  *)
  32.  
  33. FROM MOSCtrl IMPORT
  34.   ModLevel;
  35. FROM PrgCtrl IMPORT
  36.   GetBasePageAddr;
  37. FROM SYSTEM IMPORT
  38.   ASSEMBLER, ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;
  39. FROM ModCtrl IMPORT
  40.   FirstModuleStart, ReleaseModule, InstallModule;
  41. FROM MOSGlobals IMPORT
  42.   MemArea, Key, CtrlKey, CtrlSet;
  43. FROM Strings IMPORT
  44.   Length;
  45. FROM XBIOS IMPORT
  46.   KeyboardVectors;
  47. FROM Calls IMPORT
  48.   DisposeCaller, SysNewCaller, CallExtRegs, Registers;
  49. FROM KbdCtrl IMPORT
  50.   LookKey, GetKey, PutKey, UnlockKeyBuffer, LockKeyBuffer, PushBackKey;
  51. FROM Keyboard IMPORT
  52.   KeyCap, undoCap, SpecialKey, f11;
  53. IMPORT
  54.   XBRA;
  55.  
  56. CONST
  57.   f11macro = 'Hallo !';  (* Dieser Text wird für Shift-F1 (F11) ersetzt *)
  58.  
  59.   Kennung = 'KBDT';  (* XBRA-Kennung (s.u.) *)
  60.  
  61.  
  62. VAR
  63.   kbdstack: ARRAY [1..800] OF CARDINAL;
  64.   kbdentry: ADDRESS;
  65.   kbdwsp: MemArea;
  66.   kbdV: POINTER TO ADDRESS;
  67.   termwsp: MemArea;
  68.   ok: BOOLEAN;
  69.   txt: ARRAY [0..39] OF CHAR;
  70.   entry, at: ADDRESS;
  71.   carrier: XBRA.Carrier;
  72.  
  73.  
  74. PROCEDURE FormAlert (but: CARDINAL; msg: ADDRESS);
  75. (*
  76.  * Ersatz für FormAlert aus GEM-Modul, um die Importe zum mindern.
  77.  *)
  78.   (*$L-*)
  79.   BEGIN
  80.     ASSEMBLER
  81.         MOVE.L  -(A3),A0        ; msg
  82.         LEA     Data(PC),A1
  83.         LEA     24(A1),A2
  84.         MOVE.L  A0,(A2)
  85.         MOVE.L  A2,16(A1)
  86.         ADDQ    #4,A2
  87.         MOVE.L  A2,8(A1)
  88.         MOVE    -(A3),(A2)+     ; Default Button-Nr.
  89.         MOVE.L  A2,12(A1)
  90.         MOVE.L  A2,-(A7)
  91.         ADDQ    #2,A2
  92.         MOVE.L  A2,4(A1)
  93.         LEA     Control(PC),A0
  94.         MOVE.L  A0,(A1)
  95.         CLR.L   10(A2)
  96.         MOVE.L  A1,D1
  97.         MOVE    #$C8,D0
  98.         TRAP    #2
  99.         MOVE.L  (A7)+,A0
  100.         MOVE    (A0),D0     ; hier ist der gedrückte 'button' drin
  101.         RTS
  102.  
  103. Control DC.W    52,1,1,1,0,0
  104. Data    DS      52
  105.     END
  106.   END FormAlert;
  107.   (*$L=*)
  108.  
  109.  
  110. PROCEDURE term;
  111. (*
  112.  * wird bei Deinstallation ausgeführt
  113.  *)
  114.   VAR at: ADDRESS;
  115.   BEGIN
  116.     IF XBRA.Installed (Kennung, kbdV, at) THEN
  117.       XBRA.Remove (at);
  118.       DisposeCaller (kbdentry);
  119.     END;
  120.     ReleaseModule;
  121.     txt:= '[0][KbdTest deaktiviert][ OK ]';
  122.     FormAlert ( 1, ADR (txt) );
  123.   END term;
  124.  
  125. PROCEDURE kbdWriteString (s: ARRAY OF CHAR);
  126. (*
  127.  * schreibt einen String in den Tastaturpuffer
  128.  *)
  129.   VAR i: INTEGER; k: Key;
  130.   BEGIN
  131.     k.scan:= 0;
  132.     k.ctrl:= CtrlSet {};
  133.     (* LockKeyBuffer-Aufruf hier unnötig, da wir schon im IR sind. *)
  134.     FOR i:= 0 TO INTEGER (Length (s))-1 DO
  135.       k.ch:= s [i];
  136.       PutKey (k, ok)
  137.     END
  138.   END kbdWriteString;
  139.  
  140. PROCEDURE hdlKbd (VAR r: Registers);
  141. (*
  142.  * wird direkt nach jedem Tastendruck aufgerufen.
  143.  * Achtung: Bei "Auto-Repeat" einer Taste wird dies hier nicht erkannt.
  144.  * Dazu müßte zusätzlich noch im 200 HZ-Interrupt eine ähnliche Routine
  145.  * installiert werden oder generell der Tastatur-Repeat abgeschaltet werden!
  146.  *)
  147.   VAR k: Key;
  148.   BEGIN
  149.     CallExtRegs (XBRA.PreviousEntry (entry), r);
  150.                                           (* Kbd-Routine des TOS aufrufen *)
  151.     LookKey (k, ok);                      (* welche Taste wurde gedrückt? *)
  152.     IF ok THEN                            (* ist Taste gekommen? *)
  153.       IF SpecialKey (k) = f11 THEN        (* ist es Shift-F1? *)
  154.         GetKey (k, ok);                   (* - dann Taste abholen *)
  155.         kbdWriteString (f11macro)         (* und durch andere Tasten ersetzen*)
  156.       END
  157.     END;
  158.   END hdlKbd;
  159.  
  160. BEGIN
  161.   kbdV:= ADDRESS (KeyboardVectors ()) + $20L; (* Vektor f. Kbd-Auswertung *)
  162.   IF XBRA.Installed (Kennung, kbdV, at) THEN
  163.     (* Wenn Routine schon installiert ist, diese entfernen *)
  164.     term
  165.   ELSE
  166.     (* Ansonsten Installation vornehmen *)
  167.     kbdwsp.bottom:= ADR (kbdstack);             (* Stackbereich bestimmen *)
  168.     kbdwsp.length:= SIZE (kbdstack);
  169.     SysNewCaller ( hdlKbd, FALSE, kbdwsp, kbdentry ); (* Entry-Code erzeugen *)
  170.     IF kbdentry # NIL THEN
  171.       XBRA.Create ( carrier, Kennung, kbdentry, entry );
  172.       XBRA.Install ( entry, at );
  173.       termwsp.bottom:= NIL;
  174.       InstallModule (term, termwsp);            (* Modul resident machen *)
  175.       txt:= '[0][KbdTest aktiviert][ OK ]';
  176.       FormAlert ( 1, ADR (txt) )
  177.     END;
  178.   END
  179. END KbdTest.
  180.